home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / WCOMM120.ARJ / WARPCOMM.DOC < prev    next >
Text File  |  1991-02-18  |  23KB  |  840 lines

  1.                     The Warp Communications Library
  2.  
  3.                               Version 1.20
  4.  
  5.                                 written
  6.  
  7.                                    by
  8.  
  9.                               Trevor Bell
  10.  
  11.                 Copyright (C) 1991, All Rights Reserved.
  12.  
  13.  
  14. WHAT IT IS:
  15.  
  16.         The Warp Communications Library is a full-featured modem/serial
  17. communications library.  It can be used to create BBS doors, protocols,
  18. terminal programs, or actual BBS programs.  Currently the library only
  19. supports Turbo C and Turbo C++ with libraries for each, however support
  20. for MSC is on the way and if you are a registered user with the source
  21. code then you could easily modify the source to work with any C
  22. compiler.  Warp Comm supports baud rates of up to 57,600.  Warp Comm
  23. currently supports up to 8 com ports open in simultaneous operation
  24. however, this could be increased to almost any value with the source code.
  25.  
  26.         Warp Comm is NOT PUBLIC DOMAIN, Warp Comm IS SHAREWARE.  A
  27. registration fee of $25 (of course I won't mind if you send more than
  28. $25) is required if you wish to use Warp Comm in any application to be
  29. distributed to the general public.  Registration will get you the full
  30. source code for both the Turbo C and Turbo C++ libraries and library files
  31. for each of 5 memory models (small, medium, compact, large, huge).
  32. Without registration you will be limited to compiling programs in the small
  33. memory model and this will substantially limit programs.  By registering
  34. this program you will be contributing to the release of future versions
  35. of Warp Comm and future programs that I will be creating.  Your
  36. registration will be greatly appreciated.  See the file ORDER.FRM for
  37. details on registering.
  38.  
  39. Registrations may be sent to:
  40.  
  41.         Trevor Bell
  42.         P.O. Box 4173
  43.         Redondo Beach, CA  90278
  44.  
  45. I can be contacted on THE SOURCE BBS at 213-371-3737 and on THE GENERAL
  46. STORE at 213-371-2550.
  47. I can also be reached at Fidonet node 1:102/134 and at Internet address
  48. trevor.bell@f134.n102.z1.fidonet.org
  49.  
  50.  
  51. Two zip files are provided, one for Turbo C and Turbo C++ in standard
  52. C mode and one for Turbo C++ only in C++ mode.  They are:
  53.  
  54. TC.ZIP  (For C only)
  55. TCP.ZIP (For C++ only)
  56.  
  57.  
  58.  
  59. HOW TO USE IT:
  60.  
  61. --------------------------------------------------------------------------------
  62.  
  63.                For Turbo C++ and Turbo C users in Standard C mode
  64.  
  65. --------------------------------------------------------------------------------
  66.  
  67. The file WARPCOMM.H must be included in any program wishing to use the
  68. Warp Comm library in TC, and the library file WCOMMS.LIB must be linked with
  69. the program.
  70.  
  71.  
  72. Opening the Com Port:
  73. ---------------------
  74.  
  75. void com_open (unsigned int port, unsigned int baud_rate,
  76.         unsigned int interrupt_request,
  77.         unsigned int base_address, unsigned int receive_buffer_size,
  78.         unsigned int transmit_buffer_size);
  79.  
  80. port - which com port to open
  81.  
  82. baud_rate - the baud rate to open the com port at
  83.  
  84. interrupt request - which IRQ to open the comport at, usual values are
  85.         as follows:
  86.  
  87.         COM port 1: IRQ 4
  88.         COM port 2: IRQ 3
  89.  
  90.         all other COM ports are non-standard and would be machine
  91.         dependent.
  92.  
  93. base_address - which base address to use, common values are as follows:
  94.  
  95.         COM port 1: 0x3f8 (Hex)
  96.         COM port 2: 0x2f8 (Hex)
  97.  
  98. receive buffer size - this can vary with modem speed and the application
  99.         being used however, 2000 characters is usually a good place to start.
  100.  
  101. transmit buffer size - this can vary with modem speed and the application
  102.         being used however, 2000 characters is usually a good place to start.
  103.  
  104. Thus opening COM 1 at 2400 baud would work like this:
  105.  
  106.         com_open(0, 2400, 4, 0x3F8, 2000, 2000);
  107.  
  108.  
  109. Outputting to the Com Port:
  110. ---------------------------
  111.  
  112. void com_out_char(unsigned int port, char value);
  113.  
  114. Outputting to the comport in TC is accomplished like this:
  115.  
  116. char value = 13;
  117. com_out_char(0, value);
  118.  
  119.  
  120. Inputting from the Com Port:
  121. ----------------------------
  122.  
  123. void com_get_char(unsigned int port);
  124.  
  125. Inputting from the comport in TC is accomplished like this:
  126.  
  127. char value;
  128. value=com_get_char(0);
  129.  
  130.  
  131. Checking for a character waiting to be read:
  132. --------------------------------------------
  133.  
  134. void char_waiting(unsigned int port);
  135.  
  136. Often it is necessary to know if there is a character waiting in the com
  137. port receive buffer, this can be checked with the char_waiting function
  138. which returns a 1 if there is a character or characters waiting, and a 0
  139. if the com port buffer is empty.  It is used like this:
  140.  
  141. char value;
  142.  
  143. if( char_waiting(0)) {
  144.     value=com_get_char(0);
  145. }
  146.  
  147.  
  148. Closing the Com Port:
  149. ---------------------
  150.  
  151. void com_close(unsigned int port);
  152.  
  153. Closing out the com port is a simple task, it will disable com port
  154. interrupt routine, and free the memory allocated by the transmit and receive
  155. buffers.  It is used like this:
  156.  
  157. com_close(0);
  158.  
  159.  
  160. Sending a string to the Com Port:
  161. ---------------------------------
  162.  
  163. void com_out_char_str(unsigned int port, char *string);
  164. void send_modem_string(unsigned int port, char *string);
  165.  
  166. A null terminated string can be sent to the com port like this:
  167.  
  168. char *string="This is a null-terminated string.";
  169. com_out_char_str(0, string);
  170.  
  171. an alternate method of sending strings to the modem can also be used,
  172. like this:
  173.  
  174. send_modem_string(0, "ATZ|");
  175.  
  176. where the | command represents a carriage return.
  177.  
  178.  
  179.  
  180. Sending a buffer to the Com Port:
  181. ---------------------------------
  182.  
  183. void com_out_buf(unsigned int port, unsigned char *buffer, unsigned int length);
  184.  
  185. A buffer of a specified size can be sent to the com port like this:
  186.  
  187. unsigned char *buffer;
  188. unsigned int length=10;
  189. com_out_buf(0, buffer,length);
  190.  
  191.  
  192. Receiving a buffer from the Com Port:
  193. -------------------------------------
  194.  
  195. void com_get_buf(unsigned int port, unsigned char *buffer, unsigned int length);
  196.  
  197. A buffer of a specified size can be received from the com port like this:
  198.  
  199. unsigned char *buffer;
  200. unsigned int length=10;
  201. com_get_buf(0, buffer,length);
  202.  
  203.  
  204. Setting the DTR pin of the modem:
  205. ---------------------------------
  206.  
  207. void set_dtr(unsigned int port, unsigned int value);
  208.  
  209. The DTR pin of the modem can be changed like this:
  210.  
  211. set_dtr(0, 1);
  212.  
  213. A value of 1 will hold the DTR high, a value of 0 will hold it low
  214. causing most modems to hangup.
  215.  
  216.  
  217. Setting the RTS pin of the modem:
  218. ---------------------------------
  219.  
  220. void set_rts(unsigned int port, unsigned int value);
  221.  
  222. The RTS pin of the modem can be changed like this:
  223.  
  224. set_rts(0, 1);
  225.  
  226. A value of 1 will hold the RTS high allowing some modems to use hardware
  227. flow control (consult your modem manual on this), a value of 0 will
  228. hold it low.
  229.  
  230.  
  231. Clearing the transmit or receive buffers:
  232. -----------------------------------------
  233.  
  234. void purge_xmit_buffer(unsigned int port);
  235.  
  236. Clearing the transmit buffer will clear any characters waiting to be
  237. sent to the com port and is accomplished like this:
  238.  
  239. purge_xmit_buffer(0);
  240.  
  241. Clearing the receive buffer will clear any characters waiting to be
  242. received the com port and is accomplished like this:
  243.  
  244. purge_receive_buffer(0);
  245.  
  246.  
  247. Changing the baud rate:
  248. -----------------------
  249.  
  250. void set_baudrate(unsigned int port, unsigned int baud_rate);
  251.  
  252. Changing the baud rate on the modem is accomplished like this:
  253.  
  254. set_baudrate(0, 2400);
  255.  
  256.  
  257. Detecting a Carrier:
  258. --------------------
  259.  
  260. The carrier detect pin of the modem can be checked by examining the
  261. integer variable CD.  If CD is 1 then a carrier is present, if CD is 0
  262. then no carrier is present.  It can be used like this:
  263.  
  264. if(remote[0].CD==1) {
  265.     puts("A carrier is detected.");
  266. }
  267.  
  268. Reading the interrupt enable register:
  269. --------------------------------------
  270.  
  271. unsigned char read_ier(unsigned int port);
  272.  
  273. The interrupt enable register can be read like this:
  274.  
  275. unsigned char value;
  276. value=read_ier(0);
  277.  
  278.  
  279. Reading the line status register:
  280. --------------------------------------
  281.  
  282. unsigned char read_lsr(unsigned int port);
  283.  
  284. The line status register can be read like this:
  285.  
  286. unsigned char value;
  287. value=read_lsr(0);
  288.  
  289.  
  290. Reading the modem status register:
  291. --------------------------------------
  292.  
  293. unsigned char read_msr(unsigned int port);
  294.  
  295. The modem status register can be read like this:
  296.  
  297. unsigned char value;
  298. value=read_msr(0);
  299.  
  300.  
  301. Reading the line control register:
  302. --------------------------------------
  303.  
  304. unsigned char read_lcr(unsigned int port);
  305.  
  306. The line control register can be read like this:
  307.  
  308. unsigned char value;
  309. value=read_lcr(0);
  310.  
  311.  
  312. Reading the modem control register:
  313. --------------------------------------
  314.  
  315. unsigned char read_mcr(unsigned int port);
  316.  
  317. The modem control register can be read like this:
  318.  
  319. unsigned char value;
  320. value=read_mcr(0);
  321.  
  322.  
  323.  
  324. --------------------------------------------------------------------------------
  325.  
  326.                       Turbo C++ users in C++ mode
  327.  
  328. --------------------------------------------------------------------------------
  329.  
  330. The file WARPCOMM.HPP must be included in any program wishing to use the
  331. built in com routines or FOSSIL.HPP to use the Fossil Driver.
  332. Warp Comm library in TC++, and the library file WCOMMS.LIB must be linked with
  333. the program.  In the Turbo C++ versions of the library all the commands
  334. and most of the data structures are contained within the COM_port class,
  335. and thus must be accessed through the variable remote which is defined
  336. like this:
  337.  
  338. Internal Com Routines:
  339. ----------------------
  340.  
  341. COM_port remote[8];
  342.  
  343. Opening the Com Port:
  344. ---------------------
  345.  
  346. void open (unsigned int port, unsigned int baud_rate,
  347.         unsigned int interrupt_request, unsigned int base_address,
  348.         unsigned int receive_buffer_size, unsigned int transmit_buffer_size);
  349.  
  350. port - this is the com port you are opening, this number should match
  351.        the array element of remote you are using
  352.  
  353. baud_rate - the baud rate to open the com port at
  354.  
  355. interrupt request - which IRQ to open the comport at, usual values are
  356.         as follows:
  357.  
  358.         COM port 1: IRQ 4
  359.         COM port 2: IRQ 3
  360.  
  361.         all other COM ports are non-standard and would be machine
  362.         dependent.
  363.  
  364. base_address - which base address to use, common values are as follow:
  365.  
  366.         COM port 1: 0x3f8 (Hex)
  367.         COM port 2: 0x2f8 (Hex)
  368.  
  369. receive buffer size - this can vary with modem speed and the application
  370.         being used however, 2000 characters is usually a good place to start.
  371.  
  372. transmit buffer size - this can vary with modem speed and the application
  373.         being used however, 2000 characters is usually a good place to start.
  374.  
  375. Thus opening COM 1 at 2400 baud with an IRQ of 4 and with 2000 byte receive
  376. and transmit buffers would work like this:
  377.  
  378.         remote[0].open(0, 2400, 4, 0x3F8, 2000, 2000);
  379.  
  380.  
  381. Outputting to the Com Port:
  382. ---------------------------
  383.  
  384. Outputting to the comport in TC++ is identical to file stream output in C++,
  385. you simply use the overloaded bitshift operator with the variable to
  386. output to the port, like this:
  387.  
  388. char value = 13;
  389. remote[0] << value;
  390.  
  391.  
  392. Inputting from the Com Port:
  393. ----------------------------
  394.  
  395. Inputting from the comport in TC++ is identical to file stream input in C++,
  396. you simply use the overloaded bitshift operator with the variable to
  397. input from the port, like this:
  398.  
  399. char value;
  400. remote[0] >> value;
  401.  
  402.  
  403. Checking for a character waiting to be read:
  404. --------------------------------------------
  405.  
  406. Often it is necessary to know if there is a character waiting in the com
  407. port receive buffer, this can be checked with the char_waiting function
  408. which returns a 1 if there is a character or characters waiting, and a 0
  409. if the com port buffer is empty.  It is used like this:
  410.  
  411. char value;
  412.  
  413. if( remote[0].char_waiting()) {
  414.     remote[0] >> value;
  415. }
  416.  
  417.  
  418. Closing the Com Port:
  419. ---------------------
  420.  
  421. void close(void);
  422.  
  423. Closing out the com port is a simple task, it will disable com port
  424. interrupt routine, and free the memory allocated by the transmit and receive
  425. buffers.  It is used like this:
  426.  
  427. remote[0].close();
  428.  
  429.  
  430. Sending a string to the Com Port:
  431. ---------------------------------
  432.  
  433. void send_modem_string(char *s);
  434.  
  435. A null terminated string can be sent to the com port like this:
  436.  
  437. char *string="This is a null-terminated string.";
  438. remote[0] << string;
  439.  
  440. an alternate method of sending strings to the modem can also be used,
  441. like this:
  442.  
  443. remote[0].send_modem_string("ATZ|");
  444.  
  445. where the | command represents a carriage return.
  446.  
  447.  
  448. Sending a buffer to the Com Port:
  449. ---------------------------------
  450.  
  451. void out_buf(unsigned char *buffer, unsigned int length);
  452.  
  453. A buffer of a specified size can be sent to the com port like this:
  454.  
  455. unsigned char *buffer;
  456. unsigned int length=10;
  457. remote[0].out_buf(buffer,length);
  458.  
  459.  
  460. Receiving a buffer from the Com Port:
  461. -------------------------------------
  462.  
  463. void get_buf(unsigned char *buffer, unsigned int length);
  464.  
  465. A buffer of a specified size can be received from the com port like this:
  466.  
  467. unsigned char *buffer;
  468. unsigned int length=10;
  469. remote[0].get_buf(buffer,length);
  470.  
  471.  
  472. Setting the DTR pin of the modem:
  473. ---------------------------------
  474.  
  475. void set_dtr(unsigned int value);
  476.  
  477. The DTR pin of the modem can be changed like this:
  478.  
  479. remote[0].set_dtr(1);
  480.  
  481. A value of 1 will hold the DTR high, a value of 0 will hold it low
  482. causing most modems to hangup.
  483.  
  484.  
  485. Setting the RTS pin of the modem:
  486. ---------------------------------
  487.  
  488. void set_rtr(unsigned int value);
  489.  
  490. The RTS pin of the modem can be changed like this:
  491.  
  492. remote[0].set_rts(1);
  493.  
  494. A value of 1 will hold the RTS high allowing some modems to use hardware
  495. flow control (consult your modem manual on this), a value of 0 will
  496. hold it low.
  497.  
  498.  
  499. Clearing the transmit or receive buffers:
  500. -----------------------------------------
  501.  
  502. void purge_xmit_buffer(void);
  503. void purge_receive_buffer(void);
  504.  
  505. Clearing the transmit buffer will clear any characters waiting to be
  506. sent to the com port and is accomplished like this:
  507.  
  508. remote[0].purge_xmit_buffer();
  509.  
  510. Clearing the receive buffer will clear any characters waiting to be
  511. received the com port and is accomplished like this:
  512.  
  513. remote[0].purge_receive_buffer();
  514.  
  515.  
  516. Changing the baud rate:
  517. -----------------------
  518.  
  519. void set_baudrate(unsigned int baud_rate);
  520.  
  521. Changing the baud rate on the modem is accomplished like this:
  522.  
  523. remote[0].set_baudrate(2400);
  524.  
  525.  
  526. Detecting a Carrier:
  527. --------------------
  528.  
  529. The carrier detect pin of the modem can be checked by examining the
  530. integer variable CD.  If CD is 1 then a carrier is present, if CD is 0
  531. then no carrier is present.  It can be used like this:
  532.  
  533. if(remote[0].CD==1) {
  534.     puts("A carrier is detected.");
  535. }
  536.  
  537.  
  538. Reading the interrupt enable register:
  539. --------------------------------------
  540.  
  541. unsigned char read_ier(void);
  542.  
  543. The interrupt enable register can be read like this:
  544.  
  545. unsigned char value;
  546. value=remote[0].read_ier();
  547.  
  548.  
  549. Reading the line status register:
  550. --------------------------------------
  551.  
  552. unsigned char read_lsr(void);
  553.  
  554. The line status register can be read like this:
  555.  
  556. unsigned char value;
  557. value=remote[0].read_lsr();
  558.  
  559.  
  560. Reading the modem status register:
  561. --------------------------------------
  562.  
  563. unsigned char read_msr(void);
  564.  
  565. The modem status register can be read like this:
  566.  
  567. unsigned char value;
  568. value=remote[0].read_msr();
  569.  
  570.  
  571. Reading the line control register:
  572. --------------------------------------
  573.  
  574. unsigned char read_lcr(void);
  575.  
  576. The line control register can be read like this:
  577.  
  578. unsigned char value;
  579. value=remote[0].read_lcr();
  580.  
  581.  
  582. Reading the modem control register:
  583. --------------------------------------
  584.  
  585. unsigned char read_mcr(void);
  586.  
  587. The modem control register can be read like this:
  588.  
  589. unsigned char value;
  590. value=remote[0].read_mcr();
  591.  
  592.  
  593. Fossil Routines:
  594. ----------------
  595.  
  596. void open (unsigned int port, unsigned int baud_rate);
  597.  
  598. port - this is the com port you are opening, this number should match
  599.        the array element of remote you are using
  600.  
  601. baud_rate - the baud rate to open the com port at
  602.  
  603.         remote[0].open(0, 2400);
  604.  
  605.  
  606. Outputting to the Com Port:
  607. ---------------------------
  608.  
  609. Outputting to the comport in TC++ is identical to file stream output in C++,
  610. you simply use the overloaded bitshift operator with the variable to
  611. output to the port, like this:
  612.  
  613. char value = 13;
  614. remote[0] << value;
  615.  
  616.  
  617. Inputting from the Com Port:
  618. ----------------------------
  619.  
  620. Inputting from the comport in TC++ is identical to file stream input in C++,
  621. you simply use the overloaded bitshift operator with the variable to
  622. input from the port, like this:
  623.  
  624. char value;
  625. remote[0] >> value;
  626.  
  627.  
  628. Checking for a character waiting to be read:
  629. --------------------------------------------
  630.  
  631. Often it is necessary to know if there is a character waiting in the com
  632. port receive buffer, this can be checked with the char_waiting function
  633. which returns a 1 if there is a character or characters waiting, and a 0
  634. if the com port buffer is empty.  It is used like this:
  635.  
  636. char value;
  637.  
  638. if( remote[0].char_waiting()) {
  639.     remote[0] >> value;
  640. }
  641.  
  642.  
  643. Closing the Com Port:
  644. ---------------------
  645.  
  646. void close(void);
  647.  
  648. Closing out the com port is a simple task, it will disable com port
  649. interrupt routine, and free the memory allocated by the transmit and receive
  650. buffers.  It is used like this:
  651.  
  652. remote[0].close();
  653.  
  654.  
  655. Sending a string to the Com Port:
  656. ---------------------------------
  657.  
  658. void send_modem_string(char *s);
  659.  
  660. A null terminated string can be sent to the com port like this:
  661.  
  662. char *string="This is a null-terminated string.";
  663. remote[0] << string;
  664.  
  665. an alternate method of sending strings to the modem can also be used,
  666. like this:
  667.  
  668. remote[0].send_modem_string("ATZ|");
  669.  
  670. where the | command represents a carriage return.
  671.  
  672.  
  673. Sending a buffer to the Com Port:
  674. ---------------------------------
  675.  
  676. void out_buf(unsigned char *buffer, unsigned int length);
  677.  
  678. A buffer of a specified size can be sent to the com port like this:
  679.  
  680. unsigned char *buffer;
  681. unsigned int length=10;
  682. remote[0].out_buf(buffer,length);
  683.  
  684.  
  685. Receiving a buffer from the Com Port:
  686. -------------------------------------
  687.  
  688. void get_buf(unsigned char *buffer, unsigned int length);
  689.  
  690. A buffer of a specified size can be received from the com port like this:
  691.  
  692. unsigned char *buffer;
  693. unsigned int length=10;
  694. remote[0].get_buf(buffer,length);
  695.  
  696.  
  697. Setting the DTR pin of the modem:
  698. ---------------------------------
  699.  
  700. void set_dtr(unsigned int value);
  701.  
  702. The DTR pin of the modem can be changed like this:
  703.  
  704. remote[0].set_dtr(1);
  705.  
  706. A value of 1 will hold the DTR high, a value of 0 will hold it low
  707. causing most modems to hangup.
  708.  
  709.  
  710. Clearing the transmit or receive buffers:
  711. -----------------------------------------
  712.  
  713. void purge_xmit_buffer(void);
  714. void purge_receive_buffer(void);
  715.  
  716. Clearing the transmit buffer will clear any characters waiting to be
  717. sent to the com port and is accomplished like this:
  718.  
  719. remote[0].purge_xmit_buffer();
  720.  
  721. Clearing the receive buffer will clear any characters waiting to be
  722. received the com port and is accomplished like this:
  723.  
  724. remote[0].purge_receive_buffer();
  725.  
  726.  
  727. Changing the baud rate:
  728. -----------------------
  729.  
  730. void set_baudrate(unsigned int baud_rate);
  731.  
  732. Changing the baud rate on the modem is accomplished like this:
  733.  
  734. remote[0].set_baudrate(2400);
  735.  
  736.  
  737. Detecting a Carrier:
  738. --------------------
  739.  
  740. The carrier can be checked via the carrier() function, like this:
  741.  
  742. if(remote[0].carrier()) {
  743.     puts("A carrier is detected.");
  744. }
  745.  
  746.  
  747. Setting flow control:
  748. ---------------------
  749.  
  750. The flow control for the fossil port can be set like this:
  751.  
  752. remote[0].flow_control(Fossil_Port::Local_Hardware);
  753.  
  754. The flow control can be one or more of the following:
  755.  
  756. Fossil_Port::Remote_Software
  757. Fossil_Port::Local_Hardware
  758. Fossil_Port::Local_Software
  759.  
  760.  
  761. --------------------------------------------------------------------------------
  762.  
  763.                              CODE EXAMPLES
  764.  
  765. --------------------------------------------------------------------------------
  766.  
  767.  
  768. A very simple terminal program is provided with Warp Comm to demonstrate
  769. it's capabilities very minimally.  Feel free to modify it to your
  770. heart's desire, keep in mind however that without registration your
  771. program will need to remain within the small memory model.
  772.  
  773. The source code for this program is provided in the file TERM.C or
  774. TERM.CPP for TC and TC++ respectively.
  775.  
  776.  
  777.  
  778. --------------------------------------------------------------------------------
  779.  
  780.                                 SUPPORT
  781.  
  782. --------------------------------------------------------------------------------
  783.  
  784.  
  785. Support can be obtained through mail sent to my P.O. Box or by calling the
  786. following BBS:
  787.  
  788.         Name:           The Source
  789.         SysOp:          Chip North
  790.         BBS Software:   Wildcat
  791.         Phone #:        213-371-3737
  792.         Baud:           14.4k HST v.32bis
  793.  
  794.         Name:           The General Store
  795.         SysOp:          David Boehm
  796.         BBS Software:   RA 1.00
  797.         Phone #:        213-371-2550
  798.         Baud:           2400/1200
  799.  
  800. I can also be reached at Fidonet node 1:102/134 and at Internet address
  801. trevor.bell@f134.n102.z1.fidonet.org
  802.  
  803. --------------------------------------------------------------------------------
  804.  
  805.                             VERSION HISTORY
  806.  
  807. --------------------------------------------------------------------------------
  808.  
  809.  
  810. Version 1.00:
  811.         not released to the public
  812.  
  813. Version 1.01:
  814.         My first release!
  815.  
  816. Version 1.02:
  817.         Fixed null pointer assignment.
  818.  
  819. Version 1.03:
  820.         Fixed some other minor bugs.
  821.  
  822. Version 1.04:
  823.         Sped up the interrupt service routine a bit.
  824.  
  825. Version 1.10:
  826.         Multi-Line Support added!!!
  827.         Added functions to read all of the important UART ports.
  828.         Rewrote almost all functions to add multi-com port support and
  829.         better optimization.
  830.  
  831. Version 1.11:
  832.         Maintenance release - included the outstr.obj file to the library
  833.         which should have been there since the beginning.
  834.  
  835. Version 1.20:
  836.         Acquired an Internet address and declared the isr's as inline.
  837.         Added Fossil Driver support for the C++ version and a separate
  838.         Fossil_Port class.
  839.  
  840.